#define _CRT_SECURE_NO_WARNINGS 1

//#include "Queue.h"
//
//int main()
//{
//	Queue q;
//	QueueInit(&q);
//	QueuePush(&q, 1);
//	QueuePush(&q, 2);
//	QueuePush(&q, 3);
//	QueuePush(&q, 4);
//	
//	while (!QueueEmpty(&q))
//	{
//		printf("%d ", QueueFront(&q));
//		QueuePop(&q);
//	}
//	
//	QueueDestroy(&q);
//
//	return 0;
//}


//#include <stdio.h>
//#include <stdlib.h>
//#include <stdbool.h>
//#include <assert.h>
//
//typedef int QDataType;
//
//typedef struct QueueNode
//{
//	QDataType val;
//	struct QueueNode* next;
//}QNode;
//
//typedef struct Queue
//{
//	QNode* phead;
//	QNode* ptail;
//	int size;
//}Queue;
//
//void QueueInit(Queue* pq)
//{
//	assert(pq);
//
//	pq->phead = NULL;
//	pq->ptail = NULL;
//	pq->size = 0;
//}
//
//void QueueDestroy(Queue* pq)
//{
//	assert(pq);
//
//	QNode* cur = pq->phead;
//
//	while (cur)
//	{
//		QNode* next = cur->next;
//		free(cur);
//		cur = next;
//	}
//
//	pq->phead = pq->ptail = NULL;
//	pq->size = 0;
//}
//
//void QueuePush(Queue* pq, QDataType x)
//{
//	assert(pq);
//
//	QNode* newnode = (QNode*)malloc(sizeof(QNode));
//
//	if (NULL == newnode)
//	{
//		perror("malloc fail");
//		return;
//	}
//
//	newnode->val = x;
//	newnode->next = NULL;
//
//	if (pq->phead)
//	{
//		pq->ptail->next = newnode;
//		pq->ptail = newnode;
//	}
//	else
//	{
//		pq->phead = pq->ptail = newnode;
//	}
//
//	pq->size++;
//}
//
//void QueuePop(Queue* pq)
//{
//	assert(pq);
//	assert(pq->phead != NULL);
//
//	if (NULL == pq->phead->next)
//	{
//		free(pq->phead);
//		pq->phead = pq->ptail = NULL;
//	}
//	else
//	{
//		QNode* next = pq->phead->next;
//		free(pq->phead);
//		pq->phead = next;
//	}
//	
//	pq->size--;
//}
//
//QDataType QueueFront(Queue* pq)
//{
//	assert(pq);
//	assert(pq->phead != NULL);
//
//	return pq->phead->val;
//}
//
//QDataType QueueBack(Queue* pq)
//{
//	assert(pq);
//	assert(pq->ptail != NULL);
//
//	return pq->ptail->val;
//}
//
//bool QueueEmpty(Queue* pq)
//{
//	assert(pq);
//
//	return 0 == pq->size;
//}
//
//int QueueSize(Queue* pq)
//{
//	assert(pq);
//
//	return pq->size;
//}
//
//
//typedef struct
//{
//	Queue q1;
//	Queue q2;
//} MyStack;
//
//
//MyStack* myStackCreate()
//{
//	MyStack* pst = (MyStack*)malloc(sizeof(MyStack));
//	QueueInit(&pst->q1);
//	QueueInit(&pst->q2);
//
//	return pst;
//}
//
//void myStackPush(MyStack* obj, int x)
//{
//	if (!QueueEmpty(&obj->q1))
//	{
//		QueuePush(&obj->q1, x);
//	}
//	else
//	{
//		QueuePush(&obj->q2, x);
//	}
//}
//
//int myStackPop(MyStack* obj)
//{
//	//不为空前n-1导入另一个队列，删掉最后一个
//	Queue* pEmptyQ = &obj->q1;
//	Queue* pNonEmptyQ = &obj->q2;
//
//	if (!QueueEmpty(&obj->q1))
//	{
//		pEmptyQ = &obj->q2;
//		pNonEmptyQ = &obj->q1;
//	}
//
//	//不为空前n-1导入另一个空队列
//	while (QueueSize(pNonEmptyQ) > 1)
//	{
//		int front = QueueFront(pNonEmptyQ);
//		QueuePush(pEmptyQ, front);
//		QueuePop(pNonEmptyQ);
//	}
//
//	int front = QueueFront(pNonEmptyQ);
//	QueuePop(pNonEmptyQ);
//
//	return front;
//}
//
//int myStackTop(MyStack* obj)
//{
//	if (!QueueEmpty(&obj->q1))
//	{
//		return QueueBack(&obj->q1);
//	}
//	else
//	{
//		return QueueBack(&obj->q2);
//	}
//}
//
//bool myStackEmpty(MyStack* obj)
//{
//	return QueueEmpty(&obj->q1) && QueueEmpty(&obj->q2);
//}
//
//void myStackFree(MyStack* obj)
//{
//	QueueDestroy(&obj->q1);
//	QueueDestroy(&obj->q2);
//	free(obj);
//}


